package bootstrap

import (
	"fmt"
	"github.com/kataras/iris"
	"github.com/kataras/iris/middleware/logger"
	"github.com/kataras/iris/middleware/recover"
)

const ViewDir = "./views"

type Bootstrapper struct {
	*iris.Application
}

// 继承的，也就是继承参数名，得做初始化
func NewBootstrapper() *Bootstrapper {
	return &Bootstrapper{
		Application: iris.New(),
	}
}

// 注册html模板: 将viewDir 目录下的以 .html 结尾的文件都注册进去
func (b *Bootstrapper) SetupView(viewDir string) {
	htmlEngine := iris.HTML("./views", ".html").
		Layout("admin/layout.html")
	// 每次连接重新加载模板
	htmlEngine.Reload(true)

	b.RegisterView(htmlEngine)
}

// 错误处理
func (b *Bootstrapper) SetupErrorHandlers() {
	b.OnAnyErrorCode(func(ctx iris.Context) {
		ctx.WriteString(fmt.Sprintf(
			"这里是错误处理的地方，statusCode=%d\n", ctx.GetStatusCode()))
	})
}

// configure: (按制定方式)配置
// 如新建1个Configure，将路由或验证放在里面
// 再定义40行的方法，将 b 丢进去注册
type Configure func(b *Bootstrapper)

// configure: (按制定方式)配置
// 注册配置，如路由配置，验证配置
func (b *Bootstrapper) Configure(cfgs ...Configure) {
	for _, cfg := range cfgs {
		cfg(b)
	}
}

// Bootstrapper: 中文是启动配置器
func (b *Bootstrapper) Bootstrapper() {
	b.SetupView(ViewDir)
	b.SetupErrorHandlers()
	// 异常恢复
	b.Use(recover.New())
	// 日志处理，默认的配置日志会输出到终端
	b.Use(logger.New())
}

func (b *Bootstrapper) Listen(addr string, cfgs ...iris.Configurator) {
	b.Run(iris.Addr(addr), cfgs...)
}
